home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / program / misc / doublbuf.lha / main.c < prev    next >
C/C++ Source or Header  |  1995-08-15  |  5KB  |  208 lines

  1. // set tabs to 4
  2.  
  3. #include    "main.h"
  4.  
  5. //#include    <everything!>        // use premade GST with <proto/all.h> file
  6.                                 // instead
  7.  
  8. long openshit(void);
  9. void closeshit(void);
  10.  
  11. struct    Screen    *screen;
  12. extern struct ExtNewScreen NewScreenStructure;
  13.  
  14. struct    ViewPort    *VP;
  15.  
  16. struct    RastPort    *RP;            // RP = &screen->RastPort;
  17. struct    RastPort    *RP1;
  18. struct    RastPort    *RP2;
  19.  
  20. struct    MsgPort        *safe_port1;
  21. struct    MsgPort        *disp_port1;
  22. struct    MsgPort        *safe_port2;
  23. struct    MsgPort        *disp_port2;
  24.  
  25.  
  26. extern struct    ExecBase    *SysBase;
  27. struct    DosLibrary    *DOSBase;
  28. struct    IntuitionBase *IntuitionBase;
  29. struct    GfxBase        *GfxBase;
  30.  
  31. struct BitMap *bitmap1;
  32. struct BitMap *bitmap2;
  33.  
  34. struct    ScreenBuffer    *screenbuffer1;
  35. struct    ScreenBuffer    *screenbuffer2;
  36.  
  37. /*  For recall:
  38.  
  39. struct ScreenBuffer
  40. {
  41.     struct BitMap *sb_BitMap;        /* BitMap of this buffer */
  42.     struct DBufInfo *sb_DBufInfo;    /* DBufInfo for this buffer */
  43. };
  44.  
  45. struct DBufInfo {
  46.     APTR    dbi_Link1;
  47.     ULONG    dbi_Count1;
  48.     struct Message dbi_SafeMessage;        /* replied to when safe to write to old bitmap */
  49.     APTR dbi_UserData1;            /* first user data */
  50.  
  51.     APTR    dbi_Link2;
  52.     ULONG    dbi_Count2;
  53.     struct Message dbi_DispMessage;    /* replied to when new bitmap has been displayed at least
  54.                             once */
  55.     APTR    dbi_UserData2;            /* second user data */
  56.     ULONG    dbi_MatchLong;
  57.     APTR    dbi_CopPtr1;
  58.     APTR    dbi_CopPtr2;
  59.     APTR    dbi_CopPtr3;
  60.     UWORD    dbi_BeamPos1;
  61.     UWORD    dbi_BeamPos2;
  62. };
  63.  
  64. */
  65.  
  66. #define    GfxText(RP,x,y,string)    (Move(RP,x,y),Text(RP,string,strlen(string)))
  67.  
  68. void main()
  69. {
  70.     Forbid();
  71.  
  72.     if(openshit())
  73.     {
  74.         long SafeToChange = TRUE;
  75.  
  76.         long a;
  77.  
  78.         GfxText(RP2,100,100,"Buffer 2");
  79.         GfxText(RP1,100,100,"bUFFER 1");    // so the change can be noticed
  80.  
  81.         for(a=0;a<100;a++)
  82.         {
  83.             if(! SafeToChange)
  84.                 while(! GetMsg(disp_port1)) Wait(1l<<(disp_port1->mp_SigBit));
  85.                 // make sure the previous buffer was seen for at least 1 frame
  86.  
  87.             ChangeScreenBuffer(screen,screenbuffer2);
  88.             
  89.             while(! GetMsg(disp_port2)) Wait(1l<<(disp_port2->mp_SigBit));
  90.             ChangeScreenBuffer(screen,screenbuffer1);
  91.             SafeToChange = FALSE;
  92.  
  93.         }
  94.  
  95. /*        if(! SafeToChange2)
  96.         {
  97.             while(! GetMsg(disp_port2)) Wait(1L<<(disp_port2->mp_SigBit));
  98.             while(! GetMsg(safe_port2)) Wait(1L<<(safe_port2->mp_SigBit));
  99.         }
  100. */    
  101. //        if(! SafeToChange1)
  102.         {
  103.             while(! GetMsg(disp_port1)) Wait(1L<<(disp_port1->mp_SigBit));
  104.             while(! GetMsg(safe_port1)) Wait(1L<<(safe_port1->mp_SigBit));
  105.         }
  106.  
  107.     }
  108.  
  109.     closeshit();
  110.  
  111.     Permit();
  112. }
  113.  
  114. long openshit(void)
  115. {
  116.     long ok=0;
  117.  
  118.     DOSBase =         (struct DosLibrary *)        OpenLibrary("dos.library",39);
  119.     IntuitionBase = (struct IntuitionBase *)    OpenLibrary("intuition.library",39);
  120.     GfxBase    =         (struct GfxBase *)            OpenLibrary("graphics.library",39);
  121.  
  122.     if(DOSBase && IntuitionBase && GfxBase)
  123.     {
  124.         bitmap1 = AllocBitMap(cube_screen_width, cube_screen_len, cube_screen_depth, BMF_CLEAR + BMF_DISPLAYABLE + BMF_INTERLEAVED, NULL);
  125.         bitmap2 = AllocBitMap(cube_screen_width, cube_screen_len, cube_screen_depth, BMF_CLEAR + BMF_DISPLAYABLE + BMF_INTERLEAVED, NULL);
  126.  
  127.         if(bitmap1 && bitmap2)
  128.         {
  129.             NewScreenStructure.CustomBitMap = bitmap1;
  130.     
  131.             if(screen = OpenScreen((struct NewScreen *)&NewScreenStructure))
  132.             {
  133.                 Printf("screen opened ok\n");
  134.     
  135.                 screenbuffer1 = AllocScreenBuffer(screen, bitmap1, NULL);
  136.                 screenbuffer2 = AllocScreenBuffer(screen, bitmap2, NULL);
  137.  
  138.                 if (screenbuffer1 && screenbuffer2)
  139.                 {
  140.                     VP = &screen->ViewPort;
  141.  
  142.                     RP1 = AllocVec(sizeof(struct RastPort), MEMF_CLEAR);
  143.                     RP2 = AllocVec(sizeof(struct RastPort), MEMF_CLEAR);
  144.  
  145.                     if(RP1 && RP2)
  146.                     {
  147.                         InitRastPort(RP1);
  148.                         InitRastPort(RP2);
  149.  
  150.                         RP1->BitMap = bitmap1;
  151.                         RP2->BitMap = bitmap2;
  152.  
  153.                         Printf("secondary buffers ok\n");
  154.  
  155.                         safe_port1 = CreateMsgPort();
  156.                         disp_port1 = CreateMsgPort();
  157.                         safe_port2 = CreateMsgPort();
  158.                         disp_port2 = CreateMsgPort();
  159.  
  160.                         if(safe_port1 && disp_port1 && safe_port2 && disp_port2 )
  161.                         {
  162.                             screenbuffer1->sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort = safe_port1;
  163.                             screenbuffer1->sb_DBufInfo->dbi_DispMessage.mn_ReplyPort = disp_port1;
  164.  
  165.                             screenbuffer2->sb_DBufInfo->dbi_SafeMessage.mn_ReplyPort = safe_port2;
  166.                             screenbuffer2->sb_DBufInfo->dbi_DispMessage.mn_ReplyPort = disp_port2;
  167.  
  168.                             ok = 1;
  169.  
  170.                             Printf("synchro ports installed\n");
  171.  
  172.                         }
  173.                     }
  174.                 }
  175.             }
  176.         }
  177.     }    
  178.  
  179.     return(ok);
  180. }
  181.  
  182. void closeshit(void)
  183. {
  184.     
  185.     if(screen)
  186.     {
  187.         DeleteMsgPort(disp_port2);
  188.         DeleteMsgPort(safe_port2);
  189.         DeleteMsgPort(disp_port1);
  190.         DeleteMsgPort(safe_port1);
  191.  
  192.         FreeVec(RP2);
  193.         FreeVec(RP1);
  194.         FreeScreenBuffer(screen,screenbuffer2);
  195.         FreeScreenBuffer(screen,screenbuffer1);
  196.         CloseScreen(screen);
  197.     }
  198.  
  199.     WaitBlit();
  200.  
  201.     FreeBitMap(bitmap2);
  202.     FreeBitMap(bitmap1);
  203.  
  204.     CloseLibrary((struct Library *)GfxBase);
  205.     CloseLibrary((struct Library *)IntuitionBase);
  206.     CloseLibrary((struct Library *)DOSBase);
  207. }
  208.